/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package db_interaction;

import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.hibernate.Session;
import db_interaction.NewHibernateUtil;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import org.hibernate.Query;

/**
 *
 * @author Neves
 */
@Entity
@Table(name = "amigos")
public class Amigos implements Serializable {

    public Amigos() {
    }
    @Id
    @GeneratedValue
    private int Amigos_id;
    @Basic
    @Column(name = "Amigos_Utilizador_id")
    private int Amigos_Utilizador_id;
    @Basic
    @Column(name = "Amigos_Utilizador_id_amigo")
    private int Amigos_Utilizador_id_amigo;
    @Basic
    @Column(name = "Amigos_activo")
    private boolean Amigos_activo;

    //GETS
    public int GETAmigos_id() {
        return this.Amigos_id;
    }

    public int GETAmigos_Utilizador_id() {
        return this.Amigos_Utilizador_id;
    }

    public int GETAmigos_Utilizador_id_amigo() {
        return this.Amigos_Utilizador_id_amigo;
    }

    public boolean GETAmigos_activo() {
        return this.Amigos_activo;
    }

    //SETS
    public void SETAmigos_id(int Amigos_id) {
        this.Amigos_id = Amigos_id;
    }

    public void SETAmigos_Utilizador_id(int Amigos_Utilizador_id) {
        this.Amigos_Utilizador_id = Amigos_Utilizador_id;
    }

    public void SETAmigos_Utilizador_id_amigo(int Amigos_Utilizador_id_amigo) {
        this.Amigos_Utilizador_id_amigo = Amigos_Utilizador_id_amigo;
    }

    public void SETAmigos_activo(boolean Amigos_activo) {
        this.Amigos_activo = Amigos_activo;
    }

    //DB access
    public int insertEntity(Amigos friend) {
        //returns 1 if successfull
        //return -1 if error
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.save(friend);
            s.getTransaction().commit();
            System.out.println("Inserido");
            return 1;
        } catch (Exception e) {
            return -1;
        }
    }

    public int AddFriend(String email_user_login, String email_user_amigo) {

        List<Utilizador> ut = null;
        Amigos amigo = new Amigos();
        Amigos amigo2 = new Amigos();
        int id_inserted_amigo;

        try {

            Session s = NewHibernateUtil.getSessionFactory();

            int id_user_login, id_user_amigo;
            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email_user_login + "%'");
            ut = q.list();

            s.getTransaction().commit();

            id_user_login = ut.get(0).getid();


            /// *************** QUERY PARA DESCOBRIR O ID DO AMIGO QUE ELE VAI ADICIONAR ******************** //

            s.beginTransaction();

            Query q2 = s.createQuery("from Utilizador where Utilizador_email like'%" + email_user_amigo + "%'");
            ut = q2.list();

            s.getTransaction().commit();

            id_user_amigo = ut.get(0).getid();


            // ****************** INSERCAO NA TABELA AMIGOS ******************** //

            s.beginTransaction();

            amigo.SETAmigos_Utilizador_id(id_user_login);
            amigo.SETAmigos_Utilizador_id_amigo(id_user_amigo);
            amigo.SETAmigos_activo(false);

            s.save(amigo);
            s.flush();
            id_inserted_amigo = amigo.GETAmigos_id();

            s.getTransaction().commit();

            // ****************** INSERCAO NA TABELA AMIGOS INVERSO - Para o amigo tambem o ter adicionado ******************** //

            s.beginTransaction();

            amigo2.SETAmigos_Utilizador_id(id_user_amigo);
            amigo2.SETAmigos_Utilizador_id_amigo(id_user_login);
            amigo2.SETAmigos_activo(false);

            s.save(amigo2);

            s.getTransaction().commit();

            return id_inserted_amigo;

        } catch (Exception e) {
            return 0;
        }
    }

    public Boolean SeeFriend(String email_user_login, String email_user_amigo) {

        List<Utilizador> ut = null;
        List<Amigos> a = null;



        try {

            Session s = NewHibernateUtil.getSessionFactory();

            int id_user_login, id_user_amigo;
            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email_user_login + "%'");
            ut = q.list();

            s.getTransaction().commit();

            id_user_login = ut.get(0).getid();


            /// *************** QUERY PARA DESCOBRIR O ID DO AMIGO QUE ELE VAI ADICIONAR ******************** //

            s.beginTransaction();

            Query q2 = s.createQuery("from Utilizador where Utilizador_email like'%" + email_user_amigo + "%'");
            ut = q2.list();

            s.getTransaction().commit();

            id_user_amigo = ut.get(0).getid();


            // ****************** INSERCAO NA TABELA AMIGOS ******************** //

            s.beginTransaction();

            Query q3 = s.createQuery("from Amigos where Amigos_Utilizador_id = " + id_user_login + " and Amigos_Utilizador_id_amigo = " + id_user_amigo);
            a = q3.list();
            s.getTransaction().commit();

            if (a.isEmpty()) {
                return true;
            } else {
                return false;
            }

        } catch (Exception e) {
            return false;
        }
    }

    public List<Utilizador> SelectUserFriends(String email_user_login) {

        List<Utilizador> ut = null;
        List<Utilizador> users_friends = new ArrayList();
        List<Amigos> a = null;
        Utilizador aux = null;

        try {

            Session s = NewHibernateUtil.getSessionFactory();

            int id_user_login, id_user_amigo;
            s.beginTransaction();

            Query q = s.createQuery("from Utilizador where Utilizador_email like'%" + email_user_login + "%'");
            ut = q.list();

            s.getTransaction().commit();

            id_user_login = ut.get(0).getid();

            // ****************** INSERCAO NA TABELA AMIGOS ******************** //

            s.beginTransaction();
            Query q3 = s.createQuery("from Amigos where Amigos_Utilizador_id = " + id_user_login + " and Amigos_activo = 1");
            a = q3.list();
            s.getTransaction().commit();

            for (int i = 0; i < a.size(); i++) {
                int id_amigo = a.get(i).GETAmigos_Utilizador_id_amigo();

                s.beginTransaction();

                Query q4 = s.createQuery("from Utilizador where Utilizador_id = " + id_amigo);
                aux = (Utilizador) q4.list().get(0);
                users_friends.add(aux);

                s.getTransaction().commit();
            }

            return users_friends;

        } catch (Exception e) {
            return null;
        }
    }

    public Amigos SelectEntity(Amigos friend) {
        Amigos fr = null;

        //returns sellected friend if successfull
        //return null
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            fr = (Amigos) s.load(Amigos.class, friend.GETAmigos_id());
            s.getTransaction().commit();

            return fr;

        } catch (Exception e) {
            return fr;
        }
    }

    public Utilizador SelectFriendRequest(int id_amigos) {

        Amigos a = new Amigos();
        Utilizador ut = new Utilizador();
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q3 = s.createQuery("from Amigos where Amigos_id = " + id_amigos);
            a = (Amigos) q3.list().get(0);
            s.getTransaction().commit();


            s.beginTransaction();
            Query q4 = s.createQuery("from Utilizador where Utilizador_id = " + a.GETAmigos_Utilizador_id_amigo());
            ut = (Utilizador) q4.list().get(0);
            s.getTransaction().commit();

            return ut;

        } catch (Exception e) {
            return null;
        }
    }

    public Utilizador SelectIdUserUpdate(int id_amigos) {

        Amigos a = new Amigos();
        Utilizador ut = new Utilizador();
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            s.beginTransaction();
            Query q3 = s.createQuery("from Amigos where Amigos_id = " + id_amigos);
            a = (Amigos) q3.list().get(0);
            s.getTransaction().commit();


            s.beginTransaction();
            Query q4 = s.createQuery("from Utilizador where Utilizador_id = " + a.GETAmigos_Utilizador_id());
            ut = (Utilizador) q4.list().get(0);
            s.getTransaction().commit();

            return ut;

        } catch (Exception e) {
            return null;
        }
    }

    public Boolean ConfirmAddFriend(int id_amigo, int id_amigo_amigo) {

        Amigos ami = new Amigos();
        Notificacao n = new Notificacao();
        int id_registo_amigo;
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            // Obter ID do registo a alterar o valor

            s.beginTransaction();
            Query q0 = s.createQuery("from Amigos where Amigos_Utilizador_id = " + id_amigo + " and Amigos_Utilizador_id_amigo = " + id_amigo_amigo);
            ami = (Amigos) q0.list().get(0);
            s.getTransaction().commit();

            id_registo_amigo = ami.GETAmigos_id();

            s.beginTransaction();
            Query q3 = s.createQuery("update from Amigos set Amigos_activo = 1 where Amigos_id = " + id_registo_amigo);
            q3.executeUpdate();
            s.getTransaction().commit();

            id_registo_amigo = id_registo_amigo + 1;
            s.beginTransaction();
            Query q4 = s.createQuery("update from Amigos set Amigos_activo = 1 where Amigos_id = " + id_registo_amigo);
            q4.executeUpdate();
            s.getTransaction().commit();


            // Actualizar tabela de notificações para desactivar a notificacao
            id_registo_amigo = id_registo_amigo - 1;
            s.beginTransaction();
            Query q6 = s.createQuery("update from Notificacao set Notificacoes_activo = 0 where Notificacoes_Utilizador_id = " + id_amigo_amigo + " and Notificacoes_amigos_id = " + id_registo_amigo);
            q6.executeUpdate();
            s.getTransaction().commit();

            return true;

        } catch (Exception e) {
            return null;
        }
    }

    public Boolean RejectAddFriend(int id_amigo, int id_amigo_amigo) {

        Amigos ami = new Amigos();
        Notificacao n = new Notificacao();
        int id_registo_amigo;
        try {
            Session s = NewHibernateUtil.getSessionFactory();

            // Obter ID do registo a alterar o valor

            s.beginTransaction();
            Query q0 = s.createQuery("from Amigos where Amigos_Utilizador_id = " + id_amigo + " and Amigos_Utilizador_id_amigo = " + id_amigo_amigo);
            ami = (Amigos) q0.list().get(0);
            s.getTransaction().commit();

            id_registo_amigo = ami.GETAmigos_id();


            // Actualizar tabela de notificações para desactivar a notificacao

            s.beginTransaction();
            Query q6 = s.createQuery("update from Notificacao set Notificacoes_activo = 0 where Notificacoes_Utilizador_id = " + id_amigo_amigo + " and Notificacoes_amigos_id = " + id_registo_amigo);
            q6.executeUpdate();
            s.getTransaction().commit();

            return true;

        } catch (Exception e) {
            return null;
        }
    }

    public int UpdateEntity(Amigos friend) {
        //returns 1 if successfull
        //return -1 if error
        try {
            Session s = NewHibernateUtil.getSessionFactory();
            s.save(friend);
            s.getTransaction().commit();
            return 1;

        } catch (Exception e) {
            return -1;
        }
    }
}
